From 01cc9e10c271285c689d895985dd84476c1fc69e Mon Sep 17 00:00:00 2001 From: srinivasreddy Date: Mon, 21 Mar 2016 01:42:52 +0530 Subject: [PATCH] Generate the lock file when there is no lock file --- src/cargo/ops/cargo_generate_lockfile.rs | 16 ++++++++------ tests/test_cargo_generate_lockfile.rs | 27 ++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/cargo/ops/cargo_generate_lockfile.rs b/src/cargo/ops/cargo_generate_lockfile.rs index 1b8bb0087..73fc36685 100644 --- a/src/cargo/ops/cargo_generate_lockfile.rs +++ b/src/cargo/ops/cargo_generate_lockfile.rs @@ -29,18 +29,20 @@ pub fn generate_lockfile(manifest_path: &Path, config: &Config) pub fn update_lockfile(manifest_path: &Path, opts: &UpdateOptions) -> CargoResult<()> { - let package = try!(Package::for_path(manifest_path, opts.config)); - - let previous_resolve = match try!(ops::load_pkg_lockfile(&package, - opts.config)) { - Some(resolve) => resolve, - None => bail!("a Cargo.lock must exist before it is updated") - }; if opts.aggressive && opts.precise.is_some() { bail!("cannot specify both aggressive and precise simultaneously") } + let package = try!(Package::for_path(manifest_path, opts.config)); + + let previous_resolve = match try!(ops::load_pkg_lockfile(&package, opts.config)) { + Some(resolve) => resolve, + None => { + let _ = generate_lockfile(manifest_path, opts.config); + return Ok(()); + } + }; let mut registry = PackageRegistry::new(opts.config); let mut to_avoid = HashSet::new(); diff --git a/tests/test_cargo_generate_lockfile.rs b/tests/test_cargo_generate_lockfile.rs index c8a9bb6a2..39ea2af31 100644 --- a/tests/test_cargo_generate_lockfile.rs +++ b/tests/test_cargo_generate_lockfile.rs @@ -1,8 +1,8 @@ -use std::fs::File; +use std::fs::{self, File}; use std::io::prelude::*; use support::{project, execs}; -use hamcrest::{assert_that, existing_file}; +use hamcrest::{assert_that, existing_file, is_not}; fn setup() {} @@ -171,3 +171,26 @@ test!(preserve_line_endings_issue_2076 { assert!(lock2.starts_with("[root]\r\n")); assert_eq!(lock1, lock2); }); + +test!(cargo_update_generate_lockfile { + let p = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + authors = [] + version = "0.0.1" + "#) + .file("src/main.rs", "fn main() {}"); + + let lockfile = p.root().join("Cargo.lock"); + assert_that(&lockfile, is_not(existing_file())); + assert_that(p.cargo_process("update"), execs().with_status(0).with_stdout("")); + assert_that(&lockfile, existing_file()); + + fs::remove_file(p.root().join("Cargo.lock")).unwrap(); + + assert_that(&lockfile, is_not(existing_file())); + assert_that(p.cargo("update"), execs().with_status(0).with_stdout("")); + assert_that(&lockfile, existing_file()); + +}); -- 2.30.2